package org.dtrd.modules.doctor.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dtrd.config.wechat.entity.bean.officialaccount.WechatOfficialAccountUserInfo;
import org.dtrd.modules.doctor.entity.bean.*;
import org.dtrd.modules.doctor.entity.po.DtrdEntRdDoctor;
import org.dtrd.modules.doctor.entity.request.DoctorInfoRequest;
import org.dtrd.modules.doctor.entity.request.DoctorPageRequest;
import org.dtrd.modules.doctor.entity.request.SearchPatientRequest;
import org.dtrd.modules.doctor.entity.request.UpdateTeamDoctorRequest;
import org.dtrd.modules.organization.entity.bean.OrganizationListInfo;
import org.dtrd.modules.patient.entity.bean.PatientInfo;
import org.dtrd.modules.system.entity.SysUser;
import org.dtrd.modules.system.entity.bean.weixin.WxEventPushBean;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * <p>
 * 医生表 服务类
 * </p>
 *
 * @author QR
 * @since 2021-11-30 15:09:18
 */
public interface IDtrdEntRdDoctorService extends IService<DtrdEntRdDoctor> {

    /**
     * 处理微信事件
     */
    String handleQRCodeEvent(WxEventPushBean bean);

    /**
     * 校验医生的手机号
     *
     * @param doctorId 医生Id
     * @param mobile   手机号
     * @return 校验结果
     */
    boolean isInValidMobile(Integer doctorId, String mobile);

    /**
     * 校验 doctorId 的有效性
     */
    boolean isValidDoctorId(Integer doctorId);

    /**
     * 更新
     *
     * @param doctorId
     * @param mobile
     * @return
     */
    Integer synchOrSaveDoctorInfoByPhone(Integer doctorId, String mobile);

    /**
     * 获取登陆中医生的doctorId
     *
     * @return doctorId
     */
    Integer getLoginInDoctorId();

    /**
     * 通过手机号获取医生id
     *
     * @param mobile 手机号
     * @return 医生id
     */
    DoctorInfo getDoctorInfoByMobile(String mobile);

    /**
     * 通过 request 请求参数获取医生信息
     *
     * @param request 请求参数
     * @return 医生信息
     */
    DoctorInfo getDoctor(DoctorInfoRequest request);

    /**
     * 通过手机号查询医生信息
     *
     * @param phone 手机号
     * @return 查询的医生信息
     */
    DoctorInfo getDoctor(String phone);

    /**
     * 通过 unionid 获取医生信息
     */
    DoctorInfo getDoctorByUnionid(String unionid);

    DtrdEntRdDoctor getDoctorByUnionidOrOaOpenid(String unionid, String oAOpenid);

    /**
     * 通过微信公众号 openid 和 unionid 创建医生
     */
    DtrdEntRdDoctor createDoctorByOaOpenidAndUnionid(String openid, String unionid);

    /**
     * 保存或更新医生信息
     *
     * @param doctorInfo 医生信息
     * @return 操作结果
     */
    @Transactional(rollbackFor = Exception.class)
    boolean saveOrUpdateDoctor(DoctorInfo doctorInfo);

    /**
     * 后台添加医生
     *
     * @param doctorTotalInfo 医生完成信息
     * @return 操作结果
     */
    boolean saveDoctorByBackstage(DoctorInfo doctorTotalInfo);

    /**
     * 校验医生钱包提现密码
     *
     * @param walletPwd 传入的密码
     * @param doctorId  医生id
     * @return 校验结果
     */
    boolean verifyWallyPwd(String walletPwd, Integer doctorId);

    /**
     * 获取医生关联的 doctorId
     *
     * @param doctorId 医生id
     * @return 关联的机构列表
     */
    List<OrganizationListInfo> getDoctorRlOrganization(Integer doctorId);

    /**
     * 医生添加患者
     *
     * @param doctorId  医生id
     * @param patientId 患者id
     * @return 操作结果
     */
    @Transactional(rollbackFor = Exception.class)
    boolean addDoctorPatientRelation(Integer doctorId, Integer patientId);

    /**
     * 搜索患者
     *
     * @param doctorId 医生id
     * @param request  搜索参数
     * @return 搜索结果
     */
    List<PatientInfo> searchPatient(Integer doctorId, SearchPatientRequest request);

    /**
     * 根据 doctorId 获取医生名字
     */
    String getDoctorName(Integer doctorId);

    /**
     * 获取医生团队名称
     */
    String getDoctorTeamName(Integer doctorId);

    /**
     * 分页获取某个分组下的患者
     *
     * @param doctorId doctorId
     * @param groupId  groupId
     * @param page     页数
     * @param pageSize 页数据量
     * @return 患者分页列表
     */
    IPage<DoctorPatientInfo> pageGroupPatient(Integer doctorId, Integer groupId, Integer page, Integer pageSize);

    /**
     * 查询 doctorId 下的 patientId
     *
     * @param doctorId doctorId
     * @return patientId 集合
     */
    List<Integer> listPatientIds(Integer doctorId);

    /**
     * 分页获取某个服务包下的患者
     *
     * @param doctorId doctorId
     * @param status   status
     * @param page     页数
     * @param pageSize 页数据量
     * @return 患者分页列表
     */
    IPage<DoctorPatientInfo> pagePackagePatient(Integer doctorId, Integer status, Integer page, Integer pageSize);

    /**
     * 获取医生成就数据
     *
     * @param doctorId doctorId
     * @return 成就数据
     */
    DoctorAchievement getDoctorAchievement(Integer doctorId);

    /**
     * 校验医生表是否重复手机号
     */
    boolean checkDoctorMobile(String mobile, Integer doctorId);

    /**
     * 判断是否已经存在医生号码
     *
     * @return true: 已经存在 false: 不存在
     */
    boolean hasDoctorMobile(String mobile);

    /**
     * 通过微信公众号openid创建医生
     */
    DoctorInfo createDoctorByOaOpenid(String openid);

    /**
     * 通过微信用户信息创建医生
     */
    DoctorInfo createDoctorByWechatUserInfo(WechatOfficialAccountUserInfo userInfo);

    /**
     * 通过微信身份信息更新医生信息
     */
    void updateDoctorInfoByWechatUserInfo(WechatOfficialAccountUserInfo userInfo, Integer did);

    /**
     * 查询本团队之外的医生
     *
     * @return
     */
    List<DoctorInfo> getExceptTeamDoctor(String doctorName, Integer teamId);

    /**
     * 修改医生账号状态
     *
     * @param doctorId 医生Id
     * @param status   医生账号状态：0-审核未通过，1-审核通过
     * @return
     */
    boolean updateDoctorStatus(Integer doctorId, int status);

    /**
     * 设置医生审核状态
     *
     * @param doctorId      医生Id
     * @param isverify      医生审核状态：0-解除冻结,1-冻结
     * @param failureReason
     * @return
     */
    boolean setDoctorIsverify(Integer doctorId, int isverify, String failureReason);

    /**
     * 获取或创建医生
     */
    DtrdEntRdDoctor getOrCreateDoctor(String doctorName, String doctorPhone, Integer doctorType);

    /**
     * 更新团队医生信息
     */
    boolean updateTeamDoctorInfo(UpdateTeamDoctorRequest request);

    /**
     * @param pageNum  页面数
     * @param pageSize 每页大小
     * @return
     */
    IPage<DoctorInfo> listDoctorInfo(Integer pageNum, Integer pageSize, DoctorPageRequest request);

    List<Integer> listDoctorIdsByDoctorType(Integer... doctorTypes);

    /**
     * 获取医生首页动态部分信息
     */
    DoctorIndexDynamicInfo getDoctorIndexDynamicInfo(Integer doctorId);

    DoctorIndexDynamicInfo getDoctorIndexDynamicInfo(List<Integer> doctorIdList);

    /**
     * 创建关联医生
     */
    void registerDoctor(SysUser user, String doctorType);

    /**
     * 获取医生首页信息
     */
    DoctorIndexInfo getDoctorIndexInfo(Integer doctorId);

    DoctorIndexInfo getDoctorIndexInfoV2(List<Integer> doctorIdList);

    /**
     * 获取医生服务患者信息
     */
    List<PatientServiceInfo> getDoctorService(List<Integer> doctorIdList, Integer packageId);

    /**
     * 生成医生二维码
     *
     * @param doctorId
     * @param qrCodeType
     * @return
     */
    String generateQrCode(Integer doctorId, Integer qrCodeType);

    /**
     * 根据患者ID查询关联的医生信息
     *
     * @param patientId
     * @return
     */
    DtrdEntRdDoctor getDoctorInfoByPatientId(Integer patientId);

    /**
     * 根据二维码信息查询医生
     *
     * @param qrcodeUrl
     * @return
     */
    DtrdEntRdDoctor getDoctorByQrcodeUrl(String qrcodeUrl);

    /**
     * 根据医生ID删除医生
     *
     * @param doctorIds
     * @return
     */
    boolean deleteDoctorRecordById(List<Integer> doctorIds);

    /**
     * 查询医生列表
     *
     * @param orgCode
     * @param doctorsName
     * @param doctorsMobile
     * @return
     */
    List<DoctorInfo> getDoctorList(String orgCode, String doctorsName, String doctorsMobile);

    List<DtrdEntRdDoctor> getDoctorInfoByDoctorIds(List<Integer> doctorIdList);

    List<DtrdEntRdDoctor> getDoctorByIdList(List<Integer> doctorIdList);

    String getDoctorOrgCodeById(Integer doctorId);

    DoctorIndexInfo getTeamDoctorIndexInfo(Integer teamId);

    List<Integer> getDoctorTeamMemberByPatientId(Integer patientId);
}
